package com.gl.glcourses.services.impl;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.gl.glcourses.vos.*;
import com.gl.glcourses.repository.ICursosRepository;
import com.gl.glcourses.services.ICursoServices;

public class CursoServices implements ICursoServices{

	@SuppressWarnings("rawtypes")
	@Autowired
	ICursosRepository repoCurso;
	
	@Transactional
	@Override
	public Confirmacion agregarCurso(Curso curso)throws Exception{
		Confirmacion confirmacion=new Confirmacion();
		
		if (repoCurso.findCurso(curso.getNombre())==null){
			repoCurso.save(curso);
		}
		return confirmacion;
	
	}

	@Transactional
	@Override
	public Confirmacion agregarVoto(Usuario usuario,VotacionCurso votacionCurso, String comentario, int puntuacion) throws Exception{
		Confirmacion confirmacion = new Confirmacion();
		Voto voto = new Voto();
		
		voto.setUsuario(usuario);
		voto.setComentario(comentario);
		voto.setPuntuacion(puntuacion);
		voto.setVotacionCurso(votacionCurso);	
		
		this.votoUnico(voto);
		
		confirmacion.setEstado(true);
		return confirmacion;
	}
	
	@Transactional
	@SuppressWarnings("unchecked")
	@Override
	public void votoUnico(Voto voto) throws Exception{	
		Voto votoRepetido;
		VotacionCurso votacionCurso = null;
		
		votacionCurso =(VotacionCurso) repoCurso.findById(voto.getVotacionCurso().getId(), VotacionCurso.class);
		votoRepetido = repoCurso.buscarVoto(voto.getUsuario().getNombre(),voto.getVotacionCurso().getId());
		
		if(votoRepetido!=null){
			repoCurso.delete(votoRepetido);
			
		votacionCurso.quitarVoto();
		}
		votacionCurso.agregarVoto();
		repoCurso.save(voto);
		repoCurso.save(votacionCurso);
	}
	
	@Transactional
	@SuppressWarnings("unchecked")
	public List<Voto> votosUsuario(Usuario usuario) throws Exception{
		return (List<Voto>) repoCurso.getVotosUsuario(usuario);
		
	}

	@Transactional
	@SuppressWarnings("unchecked")
	@Override
	public VotacionCurso votacionGanadora(Votacion votacion) throws Exception{
		
		List<VotacionCurso>candidatos=repoCurso.getVotacionesCursos(votacion);
		int votos=0;
		VotacionCurso ganador=null;
		
		for(VotacionCurso candidato : candidatos){
			if(candidato.getCantVotos() > votos){
				votos = candidato.getCantVotos();
				ganador = candidato;
			}
		}
		return ganador;

	}
	
	@Transactional
	@SuppressWarnings("unchecked")
	public Usuario agregarUsuario(Usuario usuario) throws Exception{
		Usuario user;
		user = (Usuario) repoCurso.saveUpdateAndReturn(usuario);
		return user;
	}

}